home *** CD-ROM | disk | FTP | other *** search
- {
- > > I've got some source (a unit) for printing a graphic screen on a HP and
- > > Epson compatibles. If youre printer can emulate these 2 printers than
- > > you can use this. There are maybe some other folks interested in the
- > > source. Just ask for it, i'll send it to you the other day (only in the
- > > week, not on weekends).
-
- {----------------BEGIN OF PASCAL SOURCE---------------------------------}
-
- UNIT GRPRINT;
-
- INTERFACE
-
- Uses CRT,DOS,GRAPH;
-
- Type PrinterTypen = (HP,EPSON);
-
- Const PrinterType: PrinterTypen = HP;
-
- Var PRN: Text;
-
- Procedure DrukVenster(AchterGrondKleur,DichtHeid: Word);
- {;Procedure PrintScreen(BackColor,Resolution: Word); (translated)}
-
- IMPLEMENTATION
-
- Const ESC = #27;
-
- Var AKleur,Breedte,Hoogte: Word;
- ViewPort: ViewportType;
- Intro: String[10];
-
- Function NulFunctie(Rec: TextRec): Integer; FAR;
- Begin
- NulFunctie := 0;
- end;
-
- Function UitVoerNaarPrinter(VAR Rec: TextRec): Integer; FAR;
- Var Regs: Registers;
- Wijzer: Word;
-
- Begin
- With Rec do
- Begin
- Wijzer := 0;
- Regs.AH := 16;
- While (Wijzer < BufPos) and (Regs.AH and 16 = 16) do
- Begin
- Regs.AH := 0;
- Regs.AL := Ord(BufPtr^[Wijzer]);
- Regs.DX := UserData[1];
- Intr($17,Regs);
- INC(Wijzer);
- end; { WHILE }
- BufPos := 0;
- If Regs.AH and 16 = 16 then
- UitVoerNaarPrinter := 0
- Else
- If Regs.AH and 32 = 32 then
- UitVoerNaarPrinter := 159
- Else
- UitVoerNaarPrinter := 160;
- end; { WITH }
- end;
-
- Procedure InitHP(DichtHeid: Integer);
- Const CursorPositie: String = '5';
- Var PuntenPerInch: String[3];
-
- Begin
- Case DichtHeid of
- 1: PuntenPerInch := '75';
- 2: PuntenPerInch := '100';
- 3: PuntenPerInch := '150';
- 4: PuntenPerInch := '300';
- Else PuntenPerInch := '100';
- end; { CASE }
- Write(PRN,ESC+'E');
- Write(PRN,ESC+'*t'+PuntenPerInch+'R');
- Write(PRN,ESC+'&a'+CursorPositie+'C');
- Write(PRN,ESC+'*r1A');
- end;
-
- Procedure InitEpson(DichtHeid: Integer);
- Var RegelAfstand: String[10];
- Begin
- RegelAfstand := #27+'3'+#24;
- Case DichtHeid of
- 1: Intro := #27+'K';
- 2: Intro := #27+'L';
- 3: Intro := #27+'Y';
- 4: Intro := #27+'Z';
- Else Intro := #27+'L';
- end; { CASE }
- Write(PRN,RegelAfStand);
- end;
-
- Procedure SluitHp;
- Begin
- Write(PRN,ESC+'*rB');
- Write(PRN,ESC+'E');
- end;
-
- Procedure SluitEpson;
- Begin
- Write(PRN,#12);
- Write(PRN,#27+'@');
- end;
-
- Procedure HPAfdruk(DichtHeid: Word);
- Var RegelLengte: String[2];
- i: Integer;
-
- Procedure PuntenLijn(Y: Word);
- Var Regel: String;
- Basis: Word;
- BitNr,ByteNr,DataByte: Byte;
- Kleur: Word;
-
- Begin
- Regel := Intro;
- For ByteNr := 0 to Breedte do
- Begin
- DataByte := 0;
- Basis := 8 * ByteNr;
- For BitNr := 0 to 7 do
- Begin
- Kleur := GetPixel(BitNr+Basis,Y);
- If Kleur <> AKleur then
- DataByte := DataByte + 128 SHR BitNr;
- end; { FOR }
- Regel := Regel + Chr(DataByte);
- end; { FOR }
- Write(PRN,Regel);
- end;
-
- Begin { HPAfdruk }
- GetViewSettings(ViewPort);
- With ViewPort do
- Begin
- Breedte := (X2+1)-X1;
- Hoogte := (Breedte-7) div 8;
- end; { WITH }
- Str(Breedte+1,RegelLengte);
- Intro := ESC+'*b'+RegelLengte+'W';
- InitHp(DichtHeid);
- For i := 0 to Hoogte +1 do
- PuntenLijn(i);
- SluitHp;
- end;
-
- Procedure EpAfdruk(DichtHeid: Word);
- Var X,Y,YOfs: Integer;
- BitGegevens,Bits: Byte;
- Kleur: Byte;
-
- Begin
- GetViewSettings(ViewPort);
- With ViewPort do
- Begin
- Hoogte := Y2-Y1;
- Breedte := X2+1-X1;
- end; { WITH }
- InitEpson(DichtHeid);
- Y := 0;
- While Y < Hoogte do
- Begin
- Write(PRN,Intro,Chr(Lo(Breedte)),Chr(Hi(Breedte)));
- For X := 0 to Breedte - 1 do
- Begin
- BitGegevens := 0;
- If Y + 7 <= Hoogte then
- Bits := 7
- Else
- Bits := Hoogte - Y;
- For YOfs := 0 to Bits do
- Begin
- Kleur := GetPixel(X,YOfs+Y);
- If Kleur <> AKleur then
- BitGegevens := BitGegevens + 128 SHR YOfs;
- end; { FOR }
- Write(PRN,Chr(BitGegevens));
- end; { FOR }
- Writeln(PRN);
- INC(Y,8);
- end; { WHILE }
- SluitEpson;
- end;
-
- Procedure DrukVenster(AchterGrondKleur,DichtHeid: Word);
- Begin
- AKleur := AchterGrondKleur;
- CASE PrinterType of
- HP: HPAfdruk(DichtHeid);
- EPSON: EpAfdruk(DichtHeid);
- end; { CASE }
- end;
-
- Begin { GrPrint }
- With TextRec(PRN) do
- Begin
- Mode := FmOutPut;
- BufSize := SizeOf(Buffer);
- BufPtr := @Buffer;
- BufPos := 0;
- OpenFunc := @NulFunctie;
- InOutFunc := @UitVoerNaarPrinter;
- FlushFunc := @UitVoerNaarPrinter;
- CloseFunc := @UitVoerNaarPrinter;
- UserData[1] := 0;
- end; { WITH }
- end.
-
- ------------------END OF PASCAL SOURCE-----------------------------
-
- First set PrinterType to HP or EPSON, then call 'DrukVenster' with the
- backgroundcolor and resolution. This routine prints the current viewport.